/*
函数的拓展
1.参数默认值
2.rest参数
3.扩展运算符
4.箭头函数
5.this绑定：函数可以用this改变指向，但是箭头函数的this指向是不对的
  在es5中函数的this指向是【调用的这个函数的对象】，但是箭头函数的this指向是【定义的时候这个函数的指向】
6.尾调用
*/

{
//关于函数默认值的事情
function test(x,y='world'){
  console.log('默认值',x,y);
}
//没有传参数的时候  y的默认值是定义的那个,如果这个参数没有自定义默认值，然后没有传参是会报错的
test('hello')// hello world
}

{
  //es6中的形参和传参的作用域的关系
  let x='test';//形参
  function test2(x,y=x){
    console.log('作用域',x,y);
  }
  test2('kill')//传参
  //求：text2()中的x是输出形参还是传参
  //我：kill  kill  (正确)
  test2()//undefined undefined
  //如果  function test2(c,y=x)这样的话 这个x取到let定义的x='test'这个值
}

{
  //rest参数
  function test3(...arg){
    for(let v of arg){
      console.log('rest',v);
    }
  }
  test3(1,2,3,4,5,'a')
  //...arg是把全部的参数变成一个数组
}

{
  //扩展运算符
  console.log(...[1,4,3,2]);
//把数组转化成离散的值
}

{
  //***箭头函数
  let arrow = v => v*2;
  console.log(typeof arrow);//function
  console.log(arrow(3));//6
  let arrow2=()=>5;
  console.log(arrow2());//5
}

{
  //尾调用 存在函数式编程
  function tail(x){
    console.log('tail',x);
  }
  function fx(x){
      //尾调用
    return tail(x)
  }
  fx(100)//tail  100
  //尾调用是用来提升性能的，优化性能，如果在一个函数是依赖另外一个函数的话，而且可以用尾调用来执行的话 用尾调用
}
